import win32clipboard as clip
from PyPDF2 import PdfFileReader as pdf_reader
import re
from tkinter import Tk
from tkinter import filedialog,simpledialog
from tkinter.messagebox import showinfo,showerror
import ctypes

root=Tk()
ctypes.windll.shcore.SetProcessDpiAwareness(1)
root.tk.call("tk","scaling",ctypes.windll.shcore.GetScaleFactorForDevice(0)/75)
root.withdraw()

showinfo("Step 1","请完成以下步骤后点击确定：\n1.将PDF文件打印到OneNote中，每页PDF文档应单独打印到一页笔记中\n2.在头部新建空白页（用作目录），右键复制指向该页面的链接")

pdf_path=filedialog.askopenfilename(title="Step 2. 请选择所打印的PDF文件",filetypes=[("PDF","*.pdf")])
if pdf_path=="":
	showerror("错误","未选择文件")
	exit()

pdf=pdf_reader(open(pdf_path,"rb"))
outlines=pdf.getOutlines()

pagename_format=simpledialog.askstring(title="Step 3",prompt="请输入打印后页标题的格式\n使用“%d”代表页码，如首页标题为“第 1 页”则填入“第 %d 页”（注意空格）")
if pagename_format=="":
	showerror("错误","输入的内容为空")
	exit()
if pagename_format.find("%d")==-1:
	showerror("错误","格式错误，请使用“%d”表示页码")

pagenum_offset=simpledialog.askinteger(title="Step 4",prompt="请输入目录页码偏移量\n可先尝试输入0，若之后发现跳转错误可在下次生成时修改")

clip_html_body=""
notebook_addr=""

def parse_outlines_to_html(bookmarks:list,depth:int):
	global pdf,clip_html_body,notebook_addr,pagename_format,pagenum_offset
	clip_html_body+="<ul>"
	for index in range(len(bookmarks)):
		if isinstance(bookmarks[index],dict):
			title=bookmarks[index]['/Title']
			page=pdf.getDestinationPageNumber(bookmarks[index])
			clip_html_body+="<li><a href=\"onenote:#%s&base-path=%s\">%s</a></li>"%(pagename_format%(page+pagenum_offset),notebook_addr,title)
		elif isinstance(bookmarks[index],list):
			parse_outlines_to_html(bookmarks[index],depth+1)
	clip_html_body+="</ul>"

def parse_notebook_addr():
	global notebook_addr
	clip.OpenClipboard(0)
	clip_data=clip.GetClipboardData(clip.CF_UNICODETEXT)
	clip.CloseClipboard()
	find_list=re.findall("onenote:([^#]+)#",clip_data)
	if len(find_list)==0:
		showerror("错误","笔记本地址解析错误，请确认是否复制了指向页面的链接")
		exit()
	notebook_addr=find_list[0]

def encode_cf_html(raw_html:str)->str:
	header="Version:1.0\r\nStartHTML:%08d\r\nEndHTML:%08d\r\n"
	header=header%(len(header)+8,len(header)+8+len(raw_html))
	return header+raw_html

def write_clip_html():
	global clip_html_body
	CF_HTML=clip.RegisterClipboardFormat("HTML Format")
	clip.OpenClipboard(0)
	clip.EmptyClipboard()
	clip.SetClipboardData(CF_HTML,encode_cf_html("<DOCTYPE...><HTML><BODY>"+clip_html_body+"</BODY><HTML>").encode("utf8"))
	clip.CloseClipboard()

parse_notebook_addr()
parse_outlines_to_html(outlines,0)
write_clip_html()

showinfo("已完成","目录已生成到剪贴板，你可以粘贴至最开始新建的目录页中")
